#include "03_header.h"
#include <mysql/mysql.h>
#include <unistd.h>

void show_dir(int netfd,char* cur_dir,int len){
    write(netfd,cur_dir,len);
}
int jump_to_dir(char* cur_dir,MYSQL* db){
    int retid=-1;
    char temp[30]={0};
    char* pointer=cur_dir;
    int count=0;
    MYSQL_RES result;
    MYSQL_ROW row;
    char sql[100]="select * from file_info where parent_id = ";
    char next_sql[100]=" && username = ";
    char charid[4];
    while(pointer!=NULL){
        if(*pointer!='/'){
            temp[count++]=*pointer++;
        }
        else{
            count=0;
            pointer++;
            if(retid==-1){
                charid[0]='-';
                charid[1]='1';
            }
            else{
                int temp_count=0;
                char now[4]={0};
                int temp_id=retid;
                int left_num;//取余数
                while(temp_id>0){
                    left_num=temp_id%10;
                    now[temp_count++]=temp_id+48;
                    temp_id/=10;//用栈容器取余数，然后反向输入回去
                }
                for(int i=temp_count;i>0;i--){
                    charid[count++]=now[i-1];
                }
                count=0;
                strcat(sql,temp);
                strcat(sql,next_sql);
                strcat(sql,charid);
                int sqret=mysql_query(db,sql);                                                                             
                if(sqret==-1){
                    printf("error is:%s\n",mysql_error(db));
                    return -1;
                }
                MYSQL_RES* result=mysql_store_result(db);//db是这个接口，用这个接口
                if(result==NULL){
                    printf("Error is%s\n",mysql_error(db));
                    return -1;
                }
                row=mysql_fetch_row(result);
                retid=atoi(row[0]);
            }
            pointer++;
        }
    }
    return retid;
}
int add_dir(char* cur_dir,char* username,char* dirname,MYSQL* db){
    int retid=jump_to_dir(cur_dir,db);
    char sql[500]="insert into file_info (filename,username,parent_id,type,path) values('";
    strcat(sql,dirname);
    strcat(sql,"','");
    strcat(sql,username);
    strcat(sql,"',");
    char charid[4]={0};
    int count=0;
    int temp_count=0;
    char now[4]={0};
    int temp_id=retid;
    int left_num;//取余数
    while(temp_id>0){
        left_num=temp_id%10;
        now[temp_count++]=temp_id+48;
        temp_id/=10;//用栈容器取余数，然后反向输入回去
    }
    for(int i=temp_count;i>0;i--){
        charid[count++]=now[i-1];
    }
    strcat(sql,charid);
    strcat(sql,",'d','");
    strcat(sql,cur_dir);
    strcat(sql,"')");
    int sqret=mysql_query(db,sql);
    if(sqret==-1){
        printf("error is%s\n",mysql_error(db));
        return -1;
    }
    return 0;
}
int remove_dir(char* cur_dir,char* dirname,MYSQL* db){
    char buf[300];
    strcat(buf,cur_dir);
    strcat(buf,"/");
    strcat(buf,dirname);
    int retid=jump_to_dir(buf,db);
    char sql[500]="delete from file_info where id=";
    char charid[4]={0};
    int count=0;
    int temp_count=0;
    char now[4]={0};
    int temp_id=retid;
    int left_num;//取余数
    while(temp_id>0){
        left_num=temp_id%10;
        now[temp_count++]=temp_id+48;
        temp_id/=10;//用栈容器取余数，然后反向输入回去
    }
    for(int i=temp_count;i>0;i--){
        charid[count++]=now[i-1];
    }
    strcat(sql,charid);
    int sqret=mysql_query(db,sql);
    if(sqret==-1){
        printf("error is%s\n",mysql_error(db));
        return -1;
    }
    return 0;
}
void list_dir(int netfd,char* cur_dir,MYSQL* db){
    int retid=jump_to_dir(cur_dir,db);
    char buf[300];
    char sql[500]="select username from file_info where parent_id=";
    MYSQL_RES* result;
    MYSQL_ROW row;
    char charid[4]={0};
    int count=0;
    int temp_count=0;
    char now[4]={0};
    int temp_id=retid;
    int left_num;//取余数
    while(temp_id>0){
        left_num=temp_id%10;
        now[temp_count++]=temp_id+48;
        temp_id/=10;//用栈容器取余数，然后反向输入回去
    }
    for(int i=temp_count;i>0;i--){
        charid[count++]=now[i-1];
    }
    strcat(sql,charid);
    int sqret=mysql_query(db,sql);
    if(sqret==-1){
        printf("error is%s\n",mysql_error(db));
        return;
    }
    result=mysql_store_result(db);
    while((row=mysql_fetch_row(result))!=NULL){
        bzero(buf,sizeof(buf));
        sprintf(buf,"%s\t",row[0]);
        write(netfd,buf,strlen(buf));
    }
    return;
}
void change_dir(int netfd,char* cur_dir,char* command){
    char* pointer=command;
    char temp_dir[1024];
    int flag;
    int buf_index=0;
    int temp_dir_index;
    int count=0;
    char buf[50];
    strcpy(temp_dir,cur_dir);
    temp_dir_index=strlen(temp_dir);
    int stack[100];
    int top=0;
    for(int i=0;i<strlen(temp_dir);i++){
        if(temp_dir[i]=='/'){
            stack[count++]=i;
        }
    }
    if(*pointer=='/') strcpy(cur_dir,command);//默认目录的第一个字符是/
    else if(*pointer=='~'){
        strcpy(temp_dir,"/home");
        strcat(temp_dir,command);
        strcpy(cur_dir,temp_dir);
    }
    else{
        while(*pointer!='\0'){
        if(*pointer=='/') pointer++;
        buf_index=0;
        buf[buf_index++]='/';
        flag=0;
        while(*pointer!='/'&&*pointer!='\0'){
            if(*pointer=='.'&&flag!=3){
                flag++;
            }
            else{
                flag=3;
            }
            buf[buf_index++]=*pointer++;
        }
        if(flag==2){
            temp_dir_index=stack[--count];
            temp_dir[temp_dir_index]='\0';
        }
        if(flag==3){
            strcat(temp_dir,buf);
        }
        bzero(buf,sizeof(buf));
    }
    }
    strcpy(cur_dir,temp_dir);
    show_dir(netfd,cur_dir,strlen(cur_dir));
    return;
}
